# -*- coding: utf-8 -*-
# @Author   : SongLiangCheng
# @QQ       : 2192383945
# @Time     : 2022/11/30 10:55
# @File     : process_location.py 
# @Project  : scraping
# @Desc     : this is a toy
import argparse
import logging
import os
import sys
from urllib.parse import urlparse

import coloredlogs

from 博客园.config import CnblogConfiguration


def log_config(config):
    formatter = logging.Formatter(config.formatter_string)

    # 定义root handler
    coloredlogs.install(fmt=config.formatter_string)  # 默认INFO

    # 定义logger
    logger = logging.getLogger(__file__)
    return logger
def param_config(config):
    # 脚本参数
    parser = argparse.ArgumentParser(description='爬博客园的博客')
    parser.add_argument('--show-config', action='store_true', help='显示配置')
    parser.add_argument('--version', action='version', version='%(prog)s 2.0')
    parser.add_argument('--debug', action='store_true', help='全局debug, 所有应用打开debug')
    parser.add_argument('ini_file', nargs='?', type=str, default='config.ini',help='可选，单个ini风格的配置文件, 环境变量优先级更高')
    args = parser.parse_args()
    coloredlogs.install(fmt=config.formatter_string,level=logging.INFO if not args.debug else logging.DEBUG)
    logger.info(args)
    # 处理文件选项
    if args.ini_file:
        # 只要路径包含bin，就执行
        if 'bin' in args.ini_file.split('/'):
            os.system(args.ini_file)
            sys.exit(1)

        try:
            #  先配置覆盖，再环境变量覆盖
            config.load_config_file(args.ini_file)
        except Exception as e:
            logger.fatal(e)
            sys.exit(1)
    # 处理打印配置选项
    if args.show_config:
        config.show_config()
    return args


import os


def listFiles(dirPath):
    '''遍历指定文件夹下打印所有的文件
    :param    dirPath: 指定遍历的文件夹路径
    :return:  一个列表，包含指定文件夹下所有的文件绝对路径
    '''
    # 准备一个空列表，用来存储遍历数据
    fileList = []
    ''' os.walk(dirPath) ：走查指定的文件夹路径
            root  ：代表目录的路径
            dirs  ：一个list，包含了dirpath下所有子目录文件夹的名字
            files ：一个list，包含了所有非目录文件的名字
    '''
    for root, dirs, files in os.walk(dirPath):
        # 循环遍历列表：files【所有文件】，仅得到不包含路径的文件名

        for fileObj in files:
            # 空列表写入遍历的文件名称，兵勇目录路径拼接文件名称
            fileList.append(os.path.join(root, fileObj))

    # 打印一下列表存储内容：指定文件夹下所有的文件名
    # print(fileList)
    return fileList


def replace_str(fileDir, old_str, new_str):
    '''
    :param fileDir: 需要替换字符串的文件夹的绝对路径
    :param old_str: 替换前的字符串
    :param new_str: 替换后的字符串
    :return: 替换了字符串后重新写入内容的文件
    '''
    # 调用上面的 listFiles() 方法,获取到所有文件名称的列表
    fileList = listFiles(fileDir)
    # 循环遍历列表内容
    for file_name in fileList:
        # os.path.splitext() 方法，分割文件路径和后缀，返回列表类型的数据
        # 示例 ："D:\\test\\text.csv" 分割为：[ "D:\\test\\text" , ".csv" ]
        res = os.path.splitext(file_name)
        # 取出返回列表，下标为 1 的元素，即为文件名后缀字段
        file_extension = res[1]
        # 例如：我需要替换后缀为 .html 的文件内容
        if file_extension == ".html":
            # 以 utf-8 的编码格式打开并读写文件
            f = open(file_name, 'r+', encoding='utf-8')
            # readlines() 一次性读取所有行文件,可以遍历结果对每一行数据进行处理
            all_the_lines = f.readlines()
            # seek()方法，操作文件游标移动操作，0代表游标移动到文件开头
            f.seek(0)
            # truncate()方法，从光标所在位置进行截断【readlines() 一次性读取所有行文件，所以截取的就是全文】
            f.truncate()
            # 循环遍历文件内容的的每一行字段
            for line in all_the_lines:
                # 替换【待替换字段】后重新写入文件内容
                f.write(line.replace(old_str, new_str))
            # 关闭文件
            f.close()



if __name__ == '__main__':
    # 命令行传递配置并解析
    config = CnblogConfiguration(config_debug=True)
    config.load_from_environment_variables()

    logger = log_config(config)
    args = param_config(config)

    fileDir = config.basedir

    # replace_str(文件夹路径，替换前的字符串，替换后的字符串)
    replace_str(fileDir, config.base_domain, config.public_domain)
